package logic;

import java.io.File;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.JScrollBar;
import javax.swing.JTextArea;
import entity.DefinedRuntimeException;
import static view.Door.dir;
import static view.Door.runing;

/**
 * 归类文件.
 * @author Rex
 *
 */
public class FilesClassify {

	/**
	 * 归类文件.
	 * @param msg
	 * @param bar 
	 */
	public static void action(JTextArea msg, JScrollBar bar) throws DefinedRuntimeException {
		if (runing == false) {
			if (dir != null) {
				runing = true;
				// 提示用户
				Thread t = new Thread(() -> msg.append("请稍候……"));
				t.start();

				// 等待线程t1执行完毕后，其它线程再继续执行
				try {
					t.join();
				} catch (InterruptedException ex) {
					msg.append("线程调度失败");
					throw new DefinedRuntimeException("线程调度失败", ex);
				}

				// 客户压力测试
				new Thread(() -> FilesClassify.startup(msg, bar)).start();
			}
		} else {
			msg.append("程序正在执行，请勿重复点击");
		}

		// 拖动滚动条至最后一行
		bar.setValue(bar.getMaximum());
	}

	private static void startup(JTextArea msg, JScrollBar bar) throws DefinedRuntimeException {
		try {
			// 用于缓存所有拓展名
			Set<String> lastNames = new HashSet<>();
			// 用于缓存所有包含拓展名的文件
			List<File> haveExtension = new LinkedList<>();
			// 用于缓存所有无拓展名的文件
			List<File> noExtension = new LinkedList<>();

			// 遍历文件夹内文件，添加缓存
			for (File f : dir.listFiles()) {
				if (f.isFile()) {
					String fileName = f.getName();
					if (fileName.contains(".")) {
						String lastName = fileName.substring(fileName.lastIndexOf("."), fileName.length());
						lastNames.add(lastName);
						haveExtension.add(f);
					} else {
						noExtension.add(f);
					}
				}
			}

			// 二次遍历，归档包含拓展名的文件
			for (String flag : lastNames) {
				for (File f : haveExtension) {
					String fileName = f.getName();
					String lastName = fileName.substring(fileName.lastIndexOf("."), fileName.length());
					if (flag.equals(lastName)) {
						classify(flag, f, fileName);
					}
				}
			}

			// 三次遍历，归档无拓展名的文件
			for (File f : noExtension) {
				classify("blank", f, f.getName());
			}

			// 完成后提示用户
			msg.append("归档完成");
		} catch (Exception e) {
			msg.append("遭遇未知异常");
			throw new DefinedRuntimeException("未知的异常", e);
		} finally {
			runing = false;
			// 拖动滚动条至最后一行
			bar.setValue(bar.getMaximum());
		}
	}

	/**
	 * 归档文件.
	 * @param target 目标文件夹
	 * @param file 文件
	 * @param fileName 新文件名
	 */
	static void classify(String target, File file, String fileName) {
		File newDir = new File(dir + File.separator + target);
		newDir.mkdir();
		file.renameTo(new File(newDir + File.separator + fileName));// 归档
	}
	
}